iT邦幫忙

2023 iThome 鐵人賽

DAY 6
0
SideProject30

從零開始的外匯自動程式交易系列 第 6

DAY6 解析--EA範例的函數到底怎麼用

  • 分享至 

  • xImage
  •  

前幾天我們討論了如何開啟專案,就有許多朋友再問了,使用預設的EA範例後跑出了一堆函式,像是什麼Oninit、OnDeinit...,這些函式的用途是什麼,怎麼用? 那今天就先來講一下他們的用法跟用在哪吧!

這是我範例出現的程式

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit(){
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason){
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick(){
  }
//+------------------------------------------------------------------+
//| Trade function                                                   |
//+------------------------------------------------------------------+
void OnTrade(){
  }
  

OnInit ():

當在MT5平台中啟動一個 EA 時,OnInit() 函數會被執行一次,也只會執行一次。這個事件通常用於執行一些初始化操作,例如設定變數的初始值、載入設定或者進行其他必要的工作。而如果EA屬性、圖表符號或間期改變,EA會重新初始化,且OnInit()會再次運行。

範例應用:

int OnInit()
{
     // 設定交易手數
    Lots = 0.1; // 這裡假設手數為 0.1

// 設定止損和止盈水平
StopLoss = 30; // 假設止損為 30 點
TakeProfit = 50; // 假設止盈為 50 點

// 設定其他相關參數

return(INIT_SUCCEEDED); 返回 INIT_SUCCEEDED 表示初始化成功
}

OnDeinit ():

當在MT5平台中停止或移除一個 EA ,或是商品圖表、間期更改時,OnDeinit 函數會被執行一次。這個事件通常用於進行一些清理工作,例如釋放資源、關閉連接等。

範例應用:

 void OnDeinit(const int reason)
    {
    if(reason == REASON_REMOVE)
    {
    // EA 被移除的情況下執行的清理操作
    }
    else if(reason == REASON_CHARTCLOSE)
    {
        // 圖表被關閉的情況下執行的清理操作
    }
    // 其他情況下的清理操作
    // 通常不需要返回任何值
    }
    

在這個函數中,reason參數是一個整數值,代表了引發去初始化事件的具體情景。這個參數可以用來區分不同的去初始化情景,可以針對不同的情況執行相應的操作。
以下是一些可能的 reason 值及其含義:

REASON_REMOVE:EA 被從圖表上移除。
REASON_RECOMPILE:EA 正在重新編譯。
REASON_CHARTCHANGE:圖表的時間框架發生變化。
REASON_CHARTCLOSE:圖表被關閉。
REASON_PARAMETERS:EA 參數被修改。

OnTick():

市場上的價格發生變動(即NewTick發生)時,OnTick 事件就會被觸發,而一秒、一分鐘的價格可能變化數次,所以這個部分運行次數也會最多。這個事件通常用於執行與價格變動相關的交易邏輯,是最重要的函數,幾乎所有交易系統邏輯都發生在這。

範例應用:

void OnTick()
{
    double currentPrice = SymbolInfoDouble(_Symbol, SYMBOL_BID); // 獲取當前的買價

// 在這裡可以添加你的交易邏輯
if(currentPrice > 1.2000)
{
    // 如果當前價格大於 1.2000,執行相應的交易操作
    // 例如:開倉、平倉、修改訂單等
}
}

OnTrade():

在交易操作發生(即order pool發生變化)時,OnTrade 事件就會觸發,它通常用於處理交易相關的邏輯,例如下單、平倉、修改訂單或觸發掛單的執行情況,屬於依需求選用的。

範例應用:

void OnTrade()
{
for(int i=OrdersHistoryTotal()-1; i>=0; i--)
{
    ulong ticket = OrderGetTicket(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY));
    double profit = OrderGetDouble(ORDER_PROFIT);
    
    Print("訂單 #", ticket, " 的盈利為:", profit);
}
}

以上便是範例EA出現的四個函數的解說,因為我還不會其他函式的使用,所以OnTrade OnTick的範例應用是由ChatGPT生成,剩下還有一些前置處理指示詞、定義指令之類的,就明天再分享啦!


上一篇
DAY5 用VScode編寫MQL5教學
下一篇
DAY7 更多的事件處理器介紹
系列文
從零開始的外匯自動程式交易30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言